/**
 * JSparrow - Une version numérique du jeu "Attention Pirates !" - Copyright (C) 2014 Black Pearl
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program. If
 * not, see <http://www.gnu.org/licenses/>.
 */
package App.Modele;

/**
 * Classe abstraite de gestion des entités présentes sur les cases.
 *
 * @author BlackPearl
 */
public abstract class EntiteCase {

    protected int nbTresors;
    protected int nbPirates;
    protected int nbCanons;
    protected TypePiece[] arrayPiece;

    /**
     * Default Constructor
     * DO NOT REMOVE NOR EDIT !!
     */
    public EntiteCase()
    {
    	
    }
    
    /**
     * Initalisation du contexte.
     *
     * @param nbTresors nombre de trésors de départ de l'entité
     * @param nbPirates nombre de pirates de départ de l'entité
     * @param nbCanons nombre de canons de départ de l'entité
     */
    public EntiteCase(int nbTresors, int nbPirates, int nbCanons) {
        this.nbTresors = nbTresors;
        this.nbPirates = nbPirates;
        this.nbCanons = nbCanons;
        this.arrayPiece = new TypePiece[6];
    }

    /**
     * Vérifier que l'entité peut attaquer.
     *
     * @return true si elle peut attaquer, false sinon
     */
    public boolean peutAttaquer() {
        return (this.nbCanons > 0 && this.nbPirates > 0);
    }

    /**
     * Vérifier que l'entité peut attaquer.
     *
     * @return true si elle peut attaquer, false sinon
     */
    public boolean isAttaquable() {
        return (this.nbPirates > 0 || this.nbCanons > 0 || this.nbTresors > 0);
    }

    /**
     * Obtenir le nombre de trésors de l'entité.
     *
     * @return nombre de trésors
     */
    public int getNbTresors() {
        return nbTresors;
    }

    /**
     * Définir le nombre de trésors de l'entité.
     *
     * @param nbTresors nombre de trésors
     */
    public void setNbTresors(int nbTresors) {
        this.nbTresors = nbTresors;
    }

    /**
     * Obtenir le nombre de pirates de l'entité.
     *
     * @return nombre de pirates
     */
    public int getNbPirates() {
        return nbPirates;
    }

    /**
     * Définir le nombre de pirates de l'entité.
     *
     * @param nbPirates nombre de pirates
     */
    public void setNbPirates(int nbPirates) {
        this.nbPirates = nbPirates;
    }

    /**
     * Obtenir le nombre de canons de l'entité.
     *
     * @return nombre de canons
     */
    public int getNbCanons() {
        return nbCanons;
    }

    /**
     * Obtenir la liste des pièces de l'entité.
     * 
     * @return liste des pièces
     */
    public TypePiece[] getArrayPiece() {
        return arrayPiece;
    }

    /**
     * Définir le nombre canons de trésors de l'entité.
     *
     * @param nbCanons nombre de canons
     */
    public void setNbCanons(int nbCanons) {
        this.nbCanons = nbCanons;
    }

    /**
     * Attaquer une pièce donnée de l'entitée.
     * 
     * @param emplacement index dans la la liste des pièces
     * @return true si l'attaque a réussie et false sinon
     */
    public boolean recoitAttaque(int emplacement) {
        if (this.arrayPiece[emplacement] != null && this.arrayPiece[emplacement] != TypePiece.Tresor && this.arrayPiece[emplacement] != TypePiece.Fixe) {
            if(this.arrayPiece[emplacement] == TypePiece.Canon)
            {
            	this.nbCanons--;
            }else if(this.arrayPiece[emplacement] == TypePiece.Pirate)
            {
            	this.nbPirates--;
            }
            this.arrayPiece[emplacement] = null;
            return true;
        }
        return false;
    }
}
